package com.baidu.ueditor;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PathFormat {

  private static final String TIME = "time";
  private static final String FULL_YEAR = "yyyy";
  private static final String YEAR = "yy";
  private static final String MONTH = "mm";
  private static final String DAY = "dd";
  private static final String HOUR = "hh";
  private static final String MINUTE = "ii";
  private static final String SECOND = "ss";
  private static final String RAND = "rand";

  private static Date currentDate = null;

  public static String parse(String input) {

    Pattern pattern = Pattern.compile("\\{([^\\}]+)\\}", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(input);

    PathFormat.currentDate = new Date();

    StringBuffer sb = new StringBuffer();

    while (matcher.find()) {

      matcher.appendReplacement(sb, PathFormat.getString(matcher.group(1)));

    }

    matcher.appendTail(sb);

    return sb.toString();
  }

  /**
   * 格式化路径, 把windows路径替换成标准路径
   *
   * @param input 待格式化的路径
   * @return 格式化后的路径
   */
  public static String format(String input) {

    return input.replace("\\", "/");

  }

  public static String parse(String input, String filename) {

    Pattern pattern = Pattern.compile("\\{([^\\}]+)\\}", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(input);
    String matchStr = null;

    PathFormat.currentDate = new Date();

    StringBuffer sb = new StringBuffer();

    while (matcher.find()) {

      matchStr = matcher.group(1);
      if (matchStr.indexOf("filename") != -1) {
        filename = filename.replace("$", "\\$").replaceAll("[\\/:*?\"<>|]", "");
        matcher.appendReplacement(sb, filename);
      } else {
        matcher.appendReplacement(sb, PathFormat.getString(matchStr));
      }

    }

    matcher.appendTail(sb);

    return sb.toString();
  }

  private static String getString(String pattern) {

    pattern = pattern.toLowerCase();

    // time 处理
    if (pattern.indexOf(PathFormat.TIME) != -1) {
      return PathFormat.getTimestamp();
    } else if (pattern.indexOf(PathFormat.FULL_YEAR) != -1) {
      return PathFormat.getFullYear();
    } else if (pattern.indexOf(PathFormat.YEAR) != -1) {
      return PathFormat.getYear();
    } else if (pattern.indexOf(PathFormat.MONTH) != -1) {
      return PathFormat.getMonth();
    } else if (pattern.indexOf(PathFormat.DAY) != -1) {
      return PathFormat.getDay();
    } else if (pattern.indexOf(PathFormat.HOUR) != -1) {
      return PathFormat.getHour();
    } else if (pattern.indexOf(PathFormat.MINUTE) != -1) {
      return PathFormat.getMinute();
    } else if (pattern.indexOf(PathFormat.SECOND) != -1) {
      return PathFormat.getSecond();
    } else if (pattern.indexOf(PathFormat.RAND) != -1) {
      return PathFormat.getRandom(pattern);
    }

    return pattern;

  }

  private static String getTimestamp() {
    return System.currentTimeMillis() + "";
  }

  private static String getFullYear() {
    return new SimpleDateFormat("yyyy").format(PathFormat.currentDate);
  }

  private static String getYear() {
    return new SimpleDateFormat("yy").format(PathFormat.currentDate);
  }

  private static String getMonth() {
    return new SimpleDateFormat("MM").format(PathFormat.currentDate);
  }

  private static String getDay() {
    return new SimpleDateFormat("dd").format(PathFormat.currentDate);
  }

  private static String getHour() {
    return new SimpleDateFormat("HH").format(PathFormat.currentDate);
  }

  private static String getMinute() {
    return new SimpleDateFormat("mm").format(PathFormat.currentDate);
  }

  private static String getSecond() {
    return new SimpleDateFormat("ss").format(PathFormat.currentDate);
  }

  private static String getRandom(String pattern) {

    int length = 0;
    pattern = pattern.split(":")[1].trim();

    length = Integer.parseInt(pattern);

    return (Math.random() + "").replace(".", "").substring(0, length);

  }

  public static void main(String[] args) {
    // TODO Auto-generated method stub

  }

}
